最近花了两周的时间读了 Masonry 源码,被它优雅的语法深深打动。它把 Apple 原生 AutoLayout 冗长,繁琐的约束语法真是封装得简洁优雅到了极致。每一次看,都能看到不一样的东西,在这里也强烈推荐各位小伙伴阅读它的源码。我把我在看源码期间想到的问题,收获,总结到了下面几个问题中,您看能答出来多少呢?欢迎在下方评论。

  1. Masonry 都做了些什么?

2.下面代码会发生循环引用吗,为什么?

1
2
3
4
[self.view addSubview:btn];
[btn makeConstrants:^(MASLayoutConstraint *make){
make.left.equalTo(self.view).offset(12);
}];
  1. MAS_SHORTHANDMAS_SHORTHAND_GLOBALS 宏是做什么用的?它的效果是怎么实现的呢?
  1. MasonrymakeConstraints:updateConstraints:remakeConstraints: 有什么区别,分别适合那些场景?
  2. 描述下代码 make.left.right.top.equalTo(self.view).offset(0); 都做了些什么?
  3. Masonry 是如何做到链式优雅调用的?

下面几个问题可能比较细节,希望不要介意。

  1. MASViewConstraint 为什么要弱引用一个 MASLayoutConstraint 的实例对象,它又用这个对象做了什么?

  2. MASConstraintMaker 持有一个 constraints 数组, 而 MASViewConstrint 类也有一个用来记录约束的数组,这两个数组都是用来记录生成的约束,那么这两个数组有什么区别吗?各自的作用又是什么?

  3. 1
    2
    3
    4
    5
    6
    7
    - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    constraintMaker.updateExisting = YES;
    block(constraintMaker);
    return [constraintMaker install];
    }

    上述源码中,MASConstraintMaker 的初始化方法 initWithView:MASConstraintMaker初始化了一个 view 属性 ,MASConstraintMaker 持有这个 view 做什么?

  4. MASConstraintMaker 都在什么时候会初始化 MASViewAttribute对象?

尽管笔者水平有限,但对这些问题的拙劣见解还是会在下篇文章中放出,在这希望可以抛砖引玉,期待各位大牛共同探讨 Masonry 优雅的精髓。